package com.ntd.study.algorithm.sort.impl;

import com.ntd.study.algorithm.sort.Sort;

import java.util.function.BiFunction;

/**
 * @author liuwenju
 * @date 2021/4/16
 */
public class SortBubbling<T> implements Sort<T> {

    /**
     * 冒泡排序
     *
     * @param arrays 排序数组
     * @return
     */
    @Override
    public T[] sort(T[] arrays, BiFunction<T, T, Boolean> sort) {
        for (int i = 0; i < arrays.length - 1; i++) {
            // 设定一个标记，若为true，则表示此次循环没有进行交换，也就是待排序列已经有序，排序已经完成。
            boolean flag = true;
            for (int i1 = 0; i1 < arrays.length - i - 1; i1++) {
                if (sort.apply(arrays[i1], arrays[i1 + 1])) {
                    T temp = arrays[i1];
                    arrays[i1] = arrays[i1 + 1];
                    arrays[i1 + 1] = temp;
                    flag = false;
                }
            }
            if (flag) {
                break;
            }
        }
        return arrays;
    }
}
